iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
生成式 AI

LLM 應用、開發框架、RAG優化及評估方法 系列 第 7

Day7 GAI爆炸時代 - LCEL 介紹

  • 分享至 

  • xImage
  •  

LCEL(LangChain Expression Language)

是為了簡化模型的對話流程而開發出的表達式語言。LCEL主要透過Runnable 此物件來宣告並建立流程鏈(Chain),可使流程處理變得更靈活高效。

LCEL實作:

先建立所需要的物件

from langchain_core.prompts import ChatPromptTemplate,PromptTemplate
from langchain_core.output_parsers import StrOutputParser
str_parser = StrOutputParser()

使用 '|' 將個別物件串接成流程鏈。
執行時就會將前一個物件的輸出做為下一個物件的輸入,將個別的呼叫串接起來

(順序: 提示模板 | 語言模型 | 輸出內容解析器)

https://ithelp.ithome.com.tw/upload/images/20240811/20168537dyWMY7l1yN.png
https://ithelp.ithome.com.tw/upload/images/20240811/201685376bu4OUa6ze.png

prompt = ChatPromptTemplate.from_template('{city}位於哪個國家?')  # from_template()會包含一條來自人類的訊息


chain = prompt | chat_model | str_parser
print(chain.invoke({'city':'台北'}))

台北位於中華民國(通常稱為台灣)。台北是台灣的首都,也是該國的政治、經濟、文化中心之一。

細部分解LCEL

prompt.invoke({'city':'台北'}) # from_template()代表HumanMessage

ChatPromptValue(messages=[HumanMessage(content='台北位於哪個國家?')])

chat_model.invoke(prompt.invoke({'city':'台北'}))

AIMessage(content='台北位於中華民國(台灣)。它是台灣的首都,也是該國的政治、經濟、文化中心。', response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 16, 'total_tokens': 49}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_abc28019ad', 'finish_reason': 'stop', 'logprobs': None, 'content_filter_results': {}}, id='run-d8c6bbb2-3b4a-418e-a7b5-5f13fa404fa6-0', usage_metadata={'input_tokens': 16, 'output_tokens': 33, 'total_tokens': 49})

content = str_parser.invoke(chat_model.invoke(prompt.invoke({'city':'台北'})))
print(content)

台北位於中華民國(臺灣)的北部,是臺灣的首都和最大的城市。

class make_chain:
    def __init__(self,runnable_list):
        self.__runnable_list = runnable_list
    def invoke(self,arg):
        for runnable in self.__runnable_list:
            arg = runnable.invoke(arg)
        return arg
    
find_country_chain = make_chain([prompt, chat_model, str_parser])
find_country_chain.invoke({'city':'京都'})

京都位於日本。京都是日本歷史悠久的城市,曾經是日本的首都,擁有許多古老的寺廟、神社和傳統建築,是日本文化的重要象徵。'

langchain_core.runnables 模組

是 LangChain 生態系統中的一個強大框架,提供了一系列工具,用於創建、管理和協作稱為「Runnables」的工作單元。這些 Runnables 被設計來處理各種操作類型,包括同步、異步、批處理和串流任務。

  • 主要類別:
    Runnable():一個可以被調用、批處理、串流、轉換和組合的工作單元。
    RunnableLambda(func):將一個 Python 可調用對象轉換為 Runnable。
    RunnableParallel:並行運行多個 Runnables,並返回其輸出的映射。
    RunnableSequence:Runnables 的序列,每個的輸出作為下一個的輸入

在LangChain中,任何可以執行的單元都可視為一個Runnable (eg. 我們前面所定義好的prompt),
當我們定義好所有各別的Runnable(prompt:自定義好的promt、chat_model:我們的LLM、str_parser:欲輸出的格式)後,這邊有3個Runnable,就可以用RunnableSequence將其組合起來,形成我們所謂的"流程鏈(Chain)"。

反之,要實作出一個Chain,就必須要用RunnableSequence去將多個Runnable組合在一起哦!!

實作:改用RunnableSequence 簡化多層函式的呼叫

from langchain_core.runnables import RunnableSequence

prompt = ChatPromptTemplate.from_template('NBA {team} 隊強嗎?')
str_parser = StrOutputParser()

find_nba_chain = RunnableSequence(prompt, chat_model, str_parser)

# 跟上面那行一樣
find_nba_chain = prompt |chat_model | str_parser # 由上面透過'|'簡化得來

find_nba_chain.invoke({'team':'勇士'})

截至 2023年,金州勇士队(Golden State Warriors)仍然是NBA中的一支强队。近年来,他们在斯蒂芬·库里(Stephen Curry)、克莱·汤普森(Klay Thompson)和德雷蒙德·格林(Draymond Green)等明星球员的带领下,取得了显著的成功。\n\n勇士队曾在2015年、2017年、2018年和2022年夺得NBA总冠军。他们的三分球战术和快速节奏的进攻使他们成为联盟中最具威胁的球队之一。\n\n不过,NBA是一个竞争非常激烈的联盟,每个赛季都有许多变数,包括球员伤病、交易和新秀的表现等,这些都会影响一支球队的整体实力。因此,虽然勇士队在过去几年表现非常强劲,但每个赛季的具体情况都可能有所不同。

利用LECL 可隨意替換物件的便利性,可以隨意更換prompt template 建立另一個chain

lang_template = ChatPromptTemplate.from_template('NBA {team}球隊中最強的球員是?')

chainnn = lang_template | chat_model | str_parser
chainnn.invoke({'team':'勇士'})

截至2023年,金州勇士隊中最受矚目且被廣泛認為是最強的球員是斯蒂芬·庫里(Stephen Curry)。庫里被譽為歷史上最偉大的射手之一,他改變了現代籃球的打法,特別是三分球的使用。他在勇士隊的多次總冠軍賽中發揮了關鍵作用,並獲得了多次MVP(最有價值球員)獎項。除了庫里,勇士隊還擁有多名實力強勁的球員,如克雷·湯普森(Klay Thompson)、德雷蒙德·格林(Draymond Green)等,但庫里無疑是其中的核心人物。

下一回再針對Runnable系列介紹
就要進入進階的LECL囉!


上一篇
Day6 GAI爆炸時代 - LangChain 進階介紹 Output Parsers
下一篇
Day8 GAI爆炸時代 - LCEL 介紹
系列文
LLM 應用、開發框架、RAG優化及評估方法 26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言